{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Cartpole-v0,  a.k.a Inverted Pendulum\n",
    "##    Double Deep Q-Network (DDQN), solved in 612 episodes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Import packages, and epsilon annealing method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input_dim:  4 , output_dim:  2 , hidden_dim:  16\n",
      "threshold:  195.0\n"
     ]
    }
   ],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "\n",
    "from collections import deque\n",
    "from ddqn_agent import Agent, FloatTensor\n",
    "from replay_buffer import ReplayMemory, Transition\n",
    "from  torch.autograd import Variable\n",
    "\n",
    "# set up matplotlib\n",
    "is_ipython = 'inline' in matplotlib.get_backend()\n",
    "if is_ipython:\n",
    "    from IPython import display\n",
    "\n",
    "plt.ion()\n",
    "\n",
    "use_cuda = torch.cuda.is_available()\n",
    "FloatTensor = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor\n",
    "device = torch.device(\"cuda\" if use_cuda else \"cpu\")\n",
    "\n",
    "BATCH_SIZE = 64  \n",
    "gamma = 0.99\n",
    "LEARNING_RATE = 0.001\n",
    "TARGET_UPDATE = 10\n",
    "\n",
    "num_episodes = 20000\n",
    "print_every = 10\n",
    "hidden_dim = 16 ## \n",
    "min_eps = 0.01\n",
    "max_eps_episode = 200 #  50\n",
    "\n",
    "env = gym.make('CartPole-v0')\n",
    "env = gym.wrappers.Monitor(env, directory=\"monitors\", force=True)\n",
    "        \n",
    "space_dim =  env.observation_space.shape[0] # n_spaces\n",
    "action_dim = env.action_space.n # n_actions  \n",
    "print('input_dim: ', space_dim, ', output_dim: ', action_dim, ', hidden_dim: ', hidden_dim)\n",
    "\n",
    "threshold = env.spec.reward_threshold\n",
    "print('threshold: ', threshold)\n",
    "\n",
    "# Train agent for Double Deep Q_network\n",
    "agent = Agent(space_dim, action_dim, hidden_dime)\n",
    "\n",
    "    \n",
    "def epsilon_annealing(i_epsiode, max_episode, min_eps: float):\n",
    "    ##  if i_epsiode --> max_episode, ret_eps --> min_eps\n",
    "    ##  if i_epsiode --> 1, ret_eps --> 1  \n",
    "    slope = (min_eps - 1.0) / max_episode\n",
    "    ret_eps = max(slope * i_epsiode + 1.0, min_eps)\n",
    "    return ret_eps        \n",
    "\n",
    "def save(directory, filename):\n",
    "    torch.save(agent.q_local.state_dict(), '%s/%s_local.pth' % (directory, filename))\n",
    "    torch.save(agent.q_target.state_dict(), '%s/%s_target.pth' % (directory, filename))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Run one episode "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_episode(env, agent, eps):\n",
    "    \"\"\"Play an epsiode and train\n",
    "\n",
    "    Args:\n",
    "        env (gym.Env): gym environment (CartPole-v0)\n",
    "        agent (Agent): agent will train and get action        \n",
    "        eps (float): eps-greedy for exploration\n",
    "\n",
    "    Returns:\n",
    "        int: reward earned in this episode\n",
    "    \"\"\"\n",
    "    state = env.reset()\n",
    "    done = False\n",
    "    total_reward = 0\n",
    "    \n",
    "\n",
    "    while not done:\n",
    "\n",
    "        action = agent.get_action(FloatTensor([state]), eps)\n",
    "        \n",
    "        next_state, reward, done, _ = env.step(action.item())\n",
    "\n",
    "        total_reward += reward\n",
    "\n",
    "        if done:\n",
    "            reward = -1\n",
    "                    \n",
    "        # Store the transition in memory\n",
    "        agent.replay_memory.push(\n",
    "                (FloatTensor([state]), \n",
    "                 action, # action is already a tensor\n",
    "                 FloatTensor([reward]), \n",
    "                 FloatTensor([next_state]), \n",
    "                 FloatTensor([done])))\n",
    "                 \n",
    "\n",
    "        if len(agent.replay_memory) > BATCH_SIZE:\n",
    "\n",
    "            batch = agent.replay_memory.sample(BATCH_SIZE)\n",
    "            \n",
    "            agent.learn(batch, gamma)\n",
    "\n",
    "        state = next_state\n",
    "\n",
    "\n",
    "    return total_reward\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Train, 612 episodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode:    10 Score:  18.0  Avg.Score: 20.82, eps-greedy:  0.95 Time: 00:00:08\n",
      "Episode:    20 Score:  26.0  Avg.Score: 21.71, eps-greedy:  0.90 Time: 00:00:09\n",
      "Episode:    30 Score:  12.0  Avg.Score: 23.52, eps-greedy:  0.85 Time: 00:00:09\n",
      "Episode:    40 Score:   9.0  Avg.Score: 23.88, eps-greedy:  0.80 Time: 00:00:10\n",
      "Episode:    50 Score:  42.0  Avg.Score: 25.76, eps-greedy:  0.75 Time: 00:00:11\n",
      "Episode:    60 Score:  42.0  Avg.Score: 27.77, eps-greedy:  0.70 Time: 00:00:12\n",
      "Episode:    70 Score:  61.0  Avg.Score: 30.25, eps-greedy:  0.65 Time: 00:00:14\n",
      "Episode:    80 Score:  26.0  Avg.Score: 33.62, eps-greedy:  0.60 Time: 00:00:16\n",
      "Episode:    90 Score:  28.0  Avg.Score: 36.86, eps-greedy:  0.55 Time: 00:00:17\n",
      "Episode:   100 Score: 200.0  Avg.Score: 41.39, eps-greedy:  0.51 Time: 00:00:19\n",
      "Episode:   110 Score: 194.0  Avg.Score: 51.66, eps-greedy:  0.46 Time: 00:00:22\n",
      "Episode:   120 Score: 200.0  Avg.Score: 61.63, eps-greedy:  0.41 Time: 00:00:25\n",
      "Episode:   130 Score: 200.0  Avg.Score: 75.64, eps-greedy:  0.36 Time: 00:00:32\n",
      "Episode:   140 Score: 200.0  Avg.Score: 91.72, eps-greedy:  0.31 Time: 00:00:37\n",
      "Episode:   150 Score: 200.0  Avg.Score: 107.44, eps-greedy:  0.26 Time: 00:00:42\n",
      "Episode:   160 Score: 200.0  Avg.Score: 123.62, eps-greedy:  0.21 Time: 00:00:47\n",
      "Episode:   170 Score: 200.0  Avg.Score: 138.68, eps-greedy:  0.16 Time: 00:00:52\n",
      "Episode:   180 Score: 198.0  Avg.Score: 152.74, eps-greedy:  0.11 Time: 00:00:57\n",
      "Episode:   190 Score: 200.0  Avg.Score: 165.93, eps-greedy:  0.06 Time: 00:01:02\n",
      "Episode:   200 Score: 178.0  Avg.Score: 176.53, eps-greedy:  0.01 Time: 00:01:07\n",
      "Episode:   210 Score: 175.0  Avg.Score: 182.53, eps-greedy:  0.01 Time: 00:01:12\n",
      "Episode:   220 Score: 163.0  Avg.Score: 187.95, eps-greedy:  0.01 Time: 00:01:19\n",
      "Episode:   230 Score: 162.0  Avg.Score: 187.58, eps-greedy:  0.01 Time: 00:01:23\n",
      "Episode:   240 Score: 148.0  Avg.Score: 183.68, eps-greedy:  0.01 Time: 00:01:27\n",
      "Episode:   250 Score: 191.0  Avg.Score: 183.02, eps-greedy:  0.01 Time: 00:01:31\n",
      "Episode:   260 Score: 167.0  Avg.Score: 179.49, eps-greedy:  0.01 Time: 00:01:36\n",
      "Episode:   270 Score: 170.0  Avg.Score: 175.91, eps-greedy:  0.01 Time: 00:01:40\n",
      "Episode:   280 Score: 200.0  Avg.Score: 175.90, eps-greedy:  0.01 Time: 00:01:45\n",
      "Episode:   290 Score: 178.0  Avg.Score: 173.51, eps-greedy:  0.01 Time: 00:01:49\n",
      "Episode:   300 Score: 180.0  Avg.Score: 172.60, eps-greedy:  0.01 Time: 00:01:54\n",
      "Episode:   310 Score: 200.0  Avg.Score: 174.47, eps-greedy:  0.01 Time: 00:01:59\n",
      "Episode:   320 Score: 189.0  Avg.Score: 176.58, eps-greedy:  0.01 Time: 00:02:04\n",
      "Episode:   330 Score: 198.0  Avg.Score: 179.56, eps-greedy:  0.01 Time: 00:02:09\n",
      "Episode:   340 Score: 195.0  Avg.Score: 184.32, eps-greedy:  0.01 Time: 00:02:14\n",
      "Episode:   350 Score: 188.0  Avg.Score: 184.13, eps-greedy:  0.01 Time: 00:02:21\n",
      "Episode:   360 Score: 176.0  Avg.Score: 184.86, eps-greedy:  0.01 Time: 00:02:26\n",
      "Episode:   370 Score: 182.0  Avg.Score: 186.99, eps-greedy:  0.01 Time: 00:02:30\n",
      "Episode:   380 Score: 200.0  Avg.Score: 187.05, eps-greedy:  0.01 Time: 00:02:35\n",
      "Episode:   390 Score: 188.0  Avg.Score: 189.73, eps-greedy:  0.01 Time: 00:02:40\n",
      "Episode:   400 Score: 152.0  Avg.Score: 187.44, eps-greedy:  0.01 Time: 00:02:44\n",
      "Episode:   410 Score: 175.0  Avg.Score: 184.90, eps-greedy:  0.01 Time: 00:02:49\n",
      "Episode:   420 Score: 200.0  Avg.Score: 184.02, eps-greedy:  0.01 Time: 00:02:54\n",
      "Episode:   430 Score: 188.0  Avg.Score: 182.68, eps-greedy:  0.01 Time: 00:02:58\n",
      "Episode:   440 Score: 200.0  Avg.Score: 181.72, eps-greedy:  0.01 Time: 00:03:03\n",
      "Episode:   450 Score: 179.0  Avg.Score: 182.71, eps-greedy:  0.01 Time: 00:03:08\n",
      "Episode:   460 Score: 160.0  Avg.Score: 180.95, eps-greedy:  0.01 Time: 00:03:12\n",
      "Episode:   470 Score: 147.0  Avg.Score: 177.02, eps-greedy:  0.01 Time: 00:03:16\n",
      "Episode:   480 Score: 140.0  Avg.Score: 170.89, eps-greedy:  0.01 Time: 00:03:19\n",
      "Episode:   490 Score: 135.0  Avg.Score: 165.05, eps-greedy:  0.01 Time: 00:03:23\n",
      "Episode:   500 Score: 116.0  Avg.Score: 167.90, eps-greedy:  0.01 Time: 00:03:28\n",
      "Episode:   510 Score: 109.0  Avg.Score: 155.12, eps-greedy:  0.01 Time: 00:03:29\n",
      "Episode:   520 Score: 200.0  Avg.Score: 152.56, eps-greedy:  0.01 Time: 00:03:36\n",
      "Episode:   530 Score: 200.0  Avg.Score: 154.55, eps-greedy:  0.01 Time: 00:03:41\n",
      "Episode:   540 Score: 200.0  Avg.Score: 156.07, eps-greedy:  0.01 Time: 00:03:47\n",
      "Episode:   550 Score: 200.0  Avg.Score: 156.86, eps-greedy:  0.01 Time: 00:03:52\n",
      "Episode:   560 Score: 200.0  Avg.Score: 161.44, eps-greedy:  0.01 Time: 00:03:57\n",
      "Episode:   570 Score: 200.0  Avg.Score: 167.22, eps-greedy:  0.01 Time: 00:04:02\n",
      "Episode:   580 Score: 200.0  Avg.Score: 171.28, eps-greedy:  0.01 Time: 00:04:06\n",
      "Episode:   590 Score: 200.0  Avg.Score: 177.33, eps-greedy:  0.01 Time: 00:04:12\n",
      "Episode:   600 Score: 200.0  Avg.Score: 178.80, eps-greedy:  0.01 Time: 00:04:17\n",
      "Episode:   610 Score: 200.0  Avg.Score: 194.12, eps-greedy:  0.01 Time: 00:04:22\n",
      "\n",
      " Environment solved in 611 episodes!\tAverage Score: 195.99\n"
     ]
    }
   ],
   "source": [
    "def train():    \n",
    "\n",
    "    scores_deque = deque(maxlen=100)\n",
    "    scores_array = []\n",
    "    avg_scores_array = []    \n",
    "    \n",
    "    time_start = time.time()\n",
    "\n",
    "    for i_episode in range(num_episodes):\n",
    "        eps = epsilon_annealing(i_episode, max_eps_episode, min_eps)\n",
    "        score = run_episode(env, agent, eps)\n",
    "\n",
    "        scores_deque.append(score)\n",
    "        scores_array.append(score)\n",
    "        \n",
    "        avg_score = np.mean(scores_deque)\n",
    "        avg_scores_array.append(avg_score)\n",
    "\n",
    "        dt = (int)(time.time() - time_start)\n",
    "            \n",
    "        if i_episode % print_every == 0 and i_episode > 0:\n",
    "            print('Episode: {:5} Score: {:5}  Avg.Score: {:.2f}, eps-greedy: {:5.2f} Time: {:02}:{:02}:{:02}'.\\\n",
    "                    format(i_episode, score, avg_score, eps, dt//3600, dt%3600//60, dt%60))\n",
    "            \n",
    "        if len(scores_deque) == scores_deque.maxlen:\n",
    "            ### 195.0: for cartpole-v0 and 475 for v1\n",
    "            if np.mean(scores_deque) >= threshold: \n",
    "                print('\\n Environment solved in {:d} episodes!\\tAverage Score: {:.2f}'. \\\n",
    "                    format(i_episode, np.mean(scores_deque)))\n",
    "                break\n",
    "\n",
    "                        \n",
    "        if i_episode % TARGET_UPDATE == 0:\n",
    "            agent.q_target.load_state_dict(agent.q_local.state_dict()) \n",
    "    \n",
    "    agent.q_target.load_state_dict(agent.q_local.state_dict())\n",
    "    return scores_array, avg_scores_array\n",
    "\n",
    "scores, avg_scores = train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Plot the scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "length of scores:  612 , len of avg_scores:  612\n"
     ]
    },
    {
     "data": {
      "image/png": "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ULSObtaJrjlJhKmirXcfvDSNBlsW4xof5GrXjZzT+BdGNzzEza4rGd/4d7h2PpfnPMoj/V5g26RX+dw7JGQcPbomEnabsAypNrLUPoB73BczqfEeJuW+zpkN9/CIezJfe/sz0vMtCzJ+yar0nzEv/Qaecv6dc2zzLIUVuxCwbz3tFz/Av53/oO9390L9odhPTARCQomxFtBbQxK2uM06ByrgwA/QY0yCZ3V0cujQIdvixYtznn322c3vvPNOG739zDPP7Pn666/7C0xNnTq15Lnnniuorq62nXHGGT1LS0vLzzzzzJ6DBg3qN3fu3BDHnv/+97+5ZWVl5aWlpeXnnXdeSV1dnQDo3LnzwBtvvLFTeXl5WWlpabmVtiYvL897+umn12RkZATdICoqKpw1NTW28ePHH7bZbFx88cX733333TYAn3zyScFVV121H+Cqq67a//HHH7cxj+t2u7nqqqu6DBgwoKy0tLT8/vvvbweaZmP48OF9Tz311F69evXqf9FFF3Xz+KqHd+7ceeDOnTsdVVVVtrFjx/bu27dveZ8+ffo/9dRTbSId54wZM/J69OjRf9iwYX1nzJhRoM+hqqrKdt5555UMGDCgrKysrPyll14qAFi8eHHGwIEDy/r161deWlpabiwrEAtKDE9h/FG2hpuwfpOOxfnTyj8i3WTWOeuYTpbb5qY7qPYlBou1unGs3Oz5D6c7FgHwons8dcShmRUCJvwf2ByUL3ycRpEOZReyav0mxlR9ibf2Qa7hMuqx/p24vRIhgn1A9LBiK82Juam52oB0GnG++RNoqOKZ7v9i26rAPLfKDmz1dPD//8X3e/ni+72M7du+yfuzKvRoxniVuDySjbKEVe4S7DbBsLRdjGr4knwOkydqGWH7nlPt3/KgfIylsjcLvWVk0UA7cYiTZu+HqvUUIBhia0OnjYvgPwtgyCWauaKob5MlBX8SNoNWIoZC0to2RyjPSczSyQ8+H6meKSacvHtdV/asTqz3bvvyWs75d8SCgi+//HLB2LFjDw0aNKihoKDAM2/evKxRo0bVXnDBBZWvv/56mwsuuOBQfX29+Prrr/Oef/75ir/97W/tCwoKPOvWrVv9zTffZBx//PH9zWPW1taKq666qsenn376/aBBgxrOPffckvvvv7/ozjvv3APQrl079+rVq9fcd999Rffdd1+H119/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ewzTGu/ii/wH4dkz4KSb4YRf4rHQnDgMeU503ly8lfe+2xHU75whneM7ARULNMFk/wY4/npyx/6eEekBzav5+/npiSV0zN/Ff5cF77feX0PI5i92aFVx2gq7CO9zsnpHFW8sDn749Zg0J7pgrGvRou0LIDvNgU1Aldk5ObMApj0L3U6AmbfBk2Phojc0X5QoSJNZJ6zmxMKU0tKaE2EQoEJY+Dhs+iLw/8EKsKdB71OSO8GjhDfffLPt7373u53GtsmTJx948cUXCydMmFBz7rnnVl199dU9xo8ff1DXdtx88817zz///JLS0tLyAQMG1Pbt27euTZs2QRJ/VlaWfPzxxzefd955vTweD8ccc0ztb3/7273xzK1z584Da2pq7C6XS8ycObPgo48+Wjds2LD6Rx99tOKKK67oUV9fL8aNG1d13nnnHQK4++67d5577rm9unfv3q5Tp06N77777kbzmDfeeOO+zZs3pw8cOLBMSikKCwtdH3300UaAwYMH19x0001d1q5dmzly5MjqSy65JEi4WbJkSebvf//7LjabDYfDIR999NGKcMeZmZkp//Wvf1VMmjSpd2FhoXvkyJE1a9asyQS47777dlx55ZXd+vXrVy6lFF26dGn4/PPPN7z44ouFb775ZluHwyGLiopc99577w7z/CORNOFECPEMMAnYI6Uc4Gt7HdDvNAXAQSnlYCFECbAG0FOGLpRSXp2suaU6bq8kzVh3xZAvQr8hS6JrT6wWMIevDk1LcFzPthzXsy1j5WLyl86A2gwe7v0My5aGD/dtcHv9i2C0AnuNQcKJdm6MYbObZTFcMQveuQrm3A1r3qMg72YctuD6QrpvznvLdrC1spbJgztz84wY/V+s2LMWPr1dM2XkdIRL34UeJ4V0s5ukRCGEZcXmOl9RwAyn3S+cxGpqixStc/u7K1i6Jfi7eOUXx3HWI/OA4CgtIaJrYPTvy24TFGans9cqmkgIGHkldBoMr10Mz58NP/sYCnuG9jWgy43+BT9cVWKL09IytXUC+wjyizGy8m345BbtWNN8QqrNARP/BnnWjumKYBYtWhSSdvoPf/iDP6Vyenq6PHjw4DLj51lZWd633377h6ysLLlq1ar00047rbRPnz6N5nEmT55cPXny5NXm9u3bt6/Q35900km1VnMw9zNy0kkn1a5fv36Vub1jx46e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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "    \n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "print('length of scores: ', len(scores), ', len of avg_scores: ', len(avg_scores))\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "plt.plot(np.arange(1, len(scores)+1), scores, label=\"Score\")\n",
    "plt.plot(np.arange(1, len(avg_scores)+1), avg_scores, label=\"Avg on 100 episodes\")\n",
    "plt.legend(bbox_to_anchor=(1.05, 1)) \n",
    "plt.ylabel('Score')\n",
    "plt.xlabel('Episodes #')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Save weights of Neural Networks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "save('dir_chk_V0_ddqn', 'cartpole-v0-ddqn')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ml2-kernel",
   "language": "python",
   "name": "ml2-kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
